/**
 * 响应处理相关工具函数
 */
import { AIResponse } from '../core/types.ts';
import { splitIntoChunks, generateInitialResponse } from './conversationUtils.ts';

/**
 * 模拟流式响应（当后端不支持流式输出时使用）
 * 根据用户提示生成一个合理的模拟响应，并通过回调函数分块返回
 * 
 * @param prompt 用户提示
 * @param streamCallback 流式回调函数，用于接收生成的文本块
 * @returns 模拟的AI响应
 */
export async function simulateStreamResponse(
    prompt: string,
    streamCallback: (text: string) => void
): Promise<AIResponse> {
    try {
        // 根据提示模拟一个响应
        let response = '抱歉，无法连接到AI服务器。这是一个模拟回复。\n\n';

        // 根据提示关键词生成不同的模拟回复
        if (prompt.includes('角色设定')) {
            response += '对于角色设定，您可以考虑以下几个方面：\n\n1. 角色的背景故事\n2. 性格特点和动机\n3. 外貌和行为习惯\n4. 与其他角色的关系\n5. 角色的成长弧线';
        } else if (prompt.includes('情节')) {
            response += '关于情节发展，可以考虑：\n\n- 确保情节的因果关系清晰\n- 添加适当的冲突和悬念\n- 考虑角色行动的合理性\n- 平衡叙事节奏，避免冗长或过于紧凑';
        } else if (prompt.includes('对话')) {
            response += '改进对话的建议：\n\n- 确保每个角色有独特的声音\n- 对话应该推动情节发展或揭示角色\n- 减少使用对话标签，尽量通过行动展示情感\n- 避免过多的废话，保持对话简洁有力';
        } else if (prompt.includes('场景')) {
            response += '生动的场景描写建议：\n\n- 利用多种感官描述（视觉、听觉、嗅觉等）\n- 将场景与角色情绪联系起来\n- 选择有意义的细节，避免过度描述\n- 通过场景设置氛围，暗示主题';
        } else {
            response += '一般写作建议：\n\n- 保持语言简洁明了\n- 注重"展示"而非"讲述"\n- 定期修改和编辑您的作品\n- 阅读同类型的优秀作品以获取灵感';
        }

        // 模拟流式输出，分块发送内容
        const chunks = splitIntoChunks(response, 3);
        for (const chunk of chunks) {
            // 添加随机延迟，模拟真实打字效果
            await new Promise(resolve => setTimeout(resolve, 100 + Math.random() * 100));
            streamCallback(chunk);
        }

        return {
            success: true,
            response,
            content: response
        };
    } catch (error) {
        console.error('模拟响应失败:', error);
        return {
            success: false,
            error: '无法生成响应'
        };
    }
}

/**
 * 处理流式响应，包括发送初始模拟响应和真实响应
 * 
 * @param prompt 用户提示
 * @param realResponse 真实的API响应内容
 * @param onPartialResponse 流式回调函数
 * @param fullResponse 已经发送的初始模拟响应内容（可选）
 */
export async function handleStreamResponse(
    prompt: string,
    realResponse: string,
    onPartialResponse: (text: string) => void,
    fullResponse?: string
): Promise<void> {
    // 如果已经有模拟响应，添加分隔符并展示真实响应
    if (fullResponse) {
        // 模拟打字停顿
        await new Promise(resolve => setTimeout(resolve, 800));

        // 发送分隔符表示切换到真实响应
        onPartialResponse('\n\n----\n\n');

        // 将实际响应分成小块并模拟打字效果
        const chunks = splitIntoChunks(realResponse, 3);
        for (const chunk of chunks) {
            await new Promise(resolve => setTimeout(resolve, 50 + Math.random() * 50));
            onPartialResponse(chunk);
        }
    } else {
        // 没有预先发送模拟响应，直接发送真实响应
        const chunks = splitIntoChunks(realResponse, 3);
        for (const chunk of chunks) {
            await new Promise(resolve => setTimeout(resolve, 50 + Math.random() * 50));
            onPartialResponse(chunk);
        }
    }
}

/**
 * 开始模拟流式响应
 * 用于在实际API响应到达前提供用户反馈
 * 
 * @param prompt 用户提示
 * @param onPartialResponse 流式回调函数
 * @returns 间隔ID和当前发送的内容
 */
export function startInitialResponseSimulation(
    prompt: string,
    onPartialResponse: (text: string) => void
): { intervalId: number; fullResponse: string } {
    let fullResponse = '';
    let initialResponse = generateInitialResponse(prompt);
    let initialResponseParts = initialResponse.split(' ');
    let partIndex = 0;

    const intervalId = window.setInterval(() => {
        if (partIndex < initialResponseParts.length) {
            let part = initialResponseParts[partIndex];
            if (partIndex > 0) part = ' ' + part;
            onPartialResponse?.(part);
            fullResponse += part;
            partIndex++;
        } else {
            // 初始响应已完全输出，但不要清除间隔，让调用者决定何时停止
        }
    }, 100) as unknown as number;

    return { intervalId, fullResponse };
}

/**
 * 停止模拟流式响应
 * @param intervalId 间隔ID
 */
export function stopResponseSimulation(intervalId: number): void {
    if (intervalId) {
        clearInterval(intervalId);
    }
} 